/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Bughi
 */
public class Resposta {
    
    private HttpServletRequest request;
    private HttpServletResponse response;
    private Map<String, String> erros;
    
    public Resposta(HttpServletRequest request, HttpServletResponse response) {
        this.request = request;
        this.response = response;
        this.erros = new HashMap();
    }
    
    public enum TipoResposta{
        encaminhamento,
        redirecionamento
    }

    public enum EscopoAtributo{
        sessao,
        requisicao
    }
    
    public void definirResposta(String visao, TipoResposta tipo){
        
        if (tipo == TipoResposta.encaminhamento){
            this.visao = "/"+visao;
        } else {
            this.visao = visao;
        }
        this.tipo = tipo;
    }
    
    public void executar() throws ServletException, IOException{
        if (!this.erros.isEmpty()){
            this.adicionarAtributo("erro", erros, EscopoAtributo.requisicao);
        }
        switch (this.tipo){
            case encaminhamento:
                request.getRequestDispatcher(visao).forward(request, response);
            break;
            case redirecionamento:
                response.sendRedirect(visao);
            break;
        }
    }
    
    public boolean existeErro(){
        return !this.erros.isEmpty();
    }
    
    public void adicionarErro(String chave,String valor){
        this.erros.put(chave, valor);
    }
    
    public void adicionarAtributo(String nome, Object valor, EscopoAtributo escopo){
        switch (escopo){
            case requisicao:
                this.request.setAttribute(nome, valor);
            break;
            case sessao:
                this.request.getSession(true).setAttribute(nome, valor);
            break;
        }
    }
    
    public void removerAtributo(String nome, EscopoAtributo escopo){
        switch (escopo){
            case requisicao:
                this.request.removeAttribute(nome);
            break;
            case sessao:
                this.request.getSession(true).removeAttribute(nome);
            break;
        }
    }
    
    String visao;
    TipoResposta tipo;
}

